<?php

	class InputValidation {
		
		//Privata reguljära uttryck
		private $m_e_mail_regexp = "^[_a-zåäö0-9-]+(\.[_a-zåäö0-9-]+)*@[a-zåäö0-9-]+(\.[a-zåäö0-9-]+)*(\.[a-zåäö]{2,7})$^";
		private $m_socialsecurity_regexp = array(		
			"/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])[0-9]{4}$/",				//ÅÅMMDDXXXX 
			"/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])-[0-9]{4}$/",				//ÅÅMMDD-XXXX
			"/^[1-2][0-9]{3}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])[0-9]{4}$/",			//ÅÅÅÅMMDDXXXX
			"/^[1-2][0-9]{3}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])-[0-9]{4}$/");		//ÅÅÅÅMMDD-XXXX
		private $m_date_regexp = array(	
			"/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])$/",						//ÅÅMMDD 
			"/^[1-2][0-9]{3}(0[0-9])|(1[0-2])([0-2][0-9])|(3[0-1])$/",					//ÅÅÅÅMMDD
			"/^[0-9]{2}-(0[0-9])|(1[0-2])-([0-2][0-9])|(3[0-1])$/",						//ÅÅ-MM-DD 
			"/^[1-2][0-9]{3}-(0[1-9])|(1[0-2])-([0-2][0-9])|(3[0-1])$/");				//ÅÅÅÅ-MM-DD 
			
		private $m_allowed_tags = "<h2><p><a><ul><li><input><div>";
		//private $m_string_regexp = "/^/&lt;//&gt;/$/";
		private $m_password_regexp = "";
		private $m_password_one_number = "#[0-9]+#";
		private $m_password_one_letter = "#[a-zA-Z]#";		
		
		const ERROR_EMAIL = "Ingen giltig emailadress.";		
		const ERROR_SOCIAL_SECURITY = "Inget giltigt personnummer.";
		const ERROR_DATE = "Inget giltigt datum.";
		const ERROR_NUMBER = "Ingen siffra.";		
		const ERROR_PASSWORD_TOO_LONG = "För långt lösenord. Max 20 tecken.";
		const ERROR_PASSWORD_TOO_SHORT = "För kort lösenord. Minst 8 tecken.";
		const ERROR_PASSWORD_NUMBER = "Lösenordet måste innehålla minst en siffra.";
		const ERROR_PASSWORD_LETTER = "Lösenordet måste innehålla minst en bokstav.";
		
		
										 

		//Jämför inmatad e-mail mot regurjärt utryck
		public function IsValidEmail($eMail){
			echo "<br />" . InputValidation::ERROR_EMAIL;
				return (preg_match($this->m_e_mail_regexp, strtolower($eMail)) ? true : false);					
		}
				
		//Jämför inmatat presonnummer mot regurjärt utryck 
		public function IsValidSocielsecurity($socialsecurity){
			//Kontrollerar om formatet stämmer överäns med längden och formar sedan texten till tio soffrors nr.
			switch(strlen($socialsecurity)){
				case 10:
					if(preg_match($this->m_socialsecurity_regexp[0], $socialsecurity) == 1){
						break;
					}else{						
						echo "<br />" . InputValidation::ERROR_SOCIAL_SECURITY;
						return false;
					}
				case 11:
					if(preg_match($this->m_socialsecurity_regexp[1], $socialsecurity) == 1){
						$socialsecurity = str_replace("-", "", $socialsecurity);
						break;
					}else{
						echo "<br />" . InputValidation::ERROR_SOCIAL_SECURITY;
						return false;						
					}
					break;
				case 12:
					if(preg_match($this->m_socialsecurity_regexp[2], $socialsecurity) == 1){
						$socialsecurity = substr($socialsecurity, 2);
						break;
					}else{
	
						echo "<br />" . InputValidation::ERROR_SOCIAL_SECURITY;
						return false;
					}
					break;
				case 13:
					if(preg_match($this->m_socialsecurity_regexp[3], $socialsecurity) == 1){
						$socialsecurity = substr($socialsecurity, 2);
						$socialsecurity = str_replace("-", "", $socialsecurity);
						break;
					}else{
						
						echo "<br />" . InputValidation::ERROR_SOCIAL_SECURITY;
						return false;
					}
					break;
				default:
						echo "<br />" . InputValidation::ERROR_SOCIAL_SECURITY;
						return false;
			}
			
			//Kollar kontrollsiffran enligt luhn-algoritmen
		    $sum = 0;
		    for ($i = 0; $i < strlen($socialsecurity)-1; $i++){
		        $tmp = substr($socialsecurity, $i, 1) * (2 - ($i & 1)); //växla mellan 212121212
		        if ($tmp > 9) $tmp -= 9;
		        $sum += $tmp;
		    } 
			
		    //extrahera en-talet
		    $sum = (10 - ($sum % 10)) % 10;
		    if(!substr($socialsecurity, -1, 1) == $sum){
		    	echo "<br />" . InputValidation::ERROR_SOCIAL_SECURITY;
		    }	
			
			$socialsecurity = substr($socialsecurity,0,6) . "-" . substr($socialsecurity,6,4);
			return $socialsecurity;
		}
		
		//Jämför inmatat datum mot regurjärt utryck
		public function IsValidDate($date){
			switch(strlen($date)){
				case 6:
					if(preg_match($this->m_date_regexp[0], $date) == 1){
						break;
					}else{
		    			echo "<br />" . InputValidation::ERROR_DATE;
					}
				case 8:
					if(preg_match($this->m_date_regexp[1], $date) == 1 || 
						preg_match($this->m_date_regexp[2], $date) == 1){
						$date = str_replace("-", "", $date);
						if(strlen($date) == 8){
							$date = substr($date, 2);
						}
						break;
					}else{
						echo "<br />" . InputValidation::ERROR_DATE;
					}
					break;
				case 10:
					if(preg_match($this->m_date_regexp[3], $date) == 1){
						$date = substr($date, 2);
						$date = str_replace("-", "", $date);
						break;
					}else{
						echo "<br />" . InputValidation::ERROR_DATE;
					}
				default:
					echo "<br />" . InputValidation::ERROR_DATE;
			}

			$newdate = substr($date,0,2) . "-" . substr($date,2,2) . "-" .  substr($date,4,2);
			
		}
		
		
		//Jämför inmatad textsträng mot regurjärt utryck men godkänner vissa html-taggar
		public function IsValidStringWithHTML($string){	
			echo "Före Filtrering: ";
			var_dump($string);
			echo "<br />";
			$string = strip_tags($string, $this->m_allowed_tags);
			echo "Efter Filtrering: ";
			var_dump($string);
		}
		//Jämför inmatad textsträng mot regurjärt utryck men godkänner inga html-taggar
		public function IsValidStringWithoutHTML($string){
			echo "Före Filtrering: ";
			var_dump($string);
			echo "<br />";
			$string = strip_tags($string, '');
			echo "Efter Filtrering: ";
			var_dump($string);
		}
		//Jämför inmatat lösenord mot regurjärt utryck
		public function IsValidPassword($password){
				
				//Kontrollerar om lösenordet är kortare än 8 tecken
				if (strlen($password) < 8){
					echo InputValidation::ERROR_PASSWORD_TOO_SHORT;				
					return false;
				}
				
				//Kontrollerar om lösenordet är längre än 20 tecken
				if (strlen($password) > 20){
					echo InputValidation::ERROR_PASSWORD_TOO_LONG;	
					return false;
				}
				
				// Kontrollerar om lösenordet innehåller en siffra
				if (!preg_match($this->m_password_one_number, $password)){
					echo InputValidation::ERROR_PASSWORD_NUMBER;	
					return FALSE;
				}
				
				// Kontrollerar om lösenordet innehåller en bokstav
				if (!preg_match($this->m_password_one_letter, $password)){
					echo InputValidation::ERROR_PASSWORD_LETTER;	
					return FALSE;
				}			
				
				return TRUE;
		}		
		//Jämför inmatat Användarnamn mot regurjärt utryck
		public function IsValidNumber($number){
			echo "<br />" . InputValidation::ERROR_NUMBER;
			return is_numeric($number);
		}
				
		public function Test (){
			
			//Testar valideringen på mailadressen
			if($this->IsValidEmail("badEmail@wrong,mail,willReturnFalse") == TRUE){
				echo "Testet misslyckades! En felaktig adress har godkänts!";
				return FALSE;
			}
			if($this->IsValidEmail("braMail@awsome.com") === FALSE){
				echo "Testet misslyckades! En riktig e-mailadress har ej godkänts!";
				return FALSE;
			}
			
			//Testar valideringen på personnummer
			if($this->IsValidSocielsecurity("123456789") == TRUE){
				echo "Testet misslyckades! Ett felaktigt personnummer har godkänts!";
				return FALSE;
			}
			if($this->IsValidSocielsecurity("198908296976") == FALSE){
				echo "Testet misslyckades! Ett riktigt personnummer har ej godkänts!";
				return FALSE;
			}
			
			//Testar valideringen på Datum
			if($this->IsValidDate("12345678") == TRUE){
				echo "Testet misslyckades! Ett felaktigt datum har godkänts!";
				return FALSE;
			}
			if($this->IsValidDate("2011-09-14") === FALSE){
				echo "Testet misslyckades! Ett riktigt datum har ej godkänts!";
				return FALSE;
			}
			
			$this->IsValidStringWithHTML("<script><h2><h4>Testar h2 taggar</h4></h2></script>");

			$this->IsValidStringWithoutHTML("<h1><script><h4>Test<b>ar</b> h2 taggar</h4></script><h1>");

			//Testar valideringen på lösenord

			// Inga siffror
			if($this->IsValidPassword("gehsabdj") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// för kort
			if($this->IsValidPassword("234asd") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// för långt
			if($this->IsValidPassword("gehsab81623816238162365agvsdhgasvdghi") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// inga bokstäver
			if($this->IsValidPassword("123123123") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// Ett godkänt lösenord
			if($this->IsValidPassword("1BraLoN0rd") === FALSE){
				echo "Testet misslyckades! Ett riktigt lösenord har ej godkänts!";
				return FALSE;
			}
			
			//Testar valideringen på användarnamn
			if($this->IsValidNumber("123123hej124") == TRUE){
				echo "Testet misslyckades! Ett felaktigt nummer har godkänts!";
				return FALSE;
			}
			if($this->IsValidNumber("74327235873427") === FALSE){
				echo "Testet misslyckades! Ett riktigt nummer har ej godkänts!";
				return FALSE;
			}
			
			if($this->IsValidNumber(2123.3) === FALSE){
				echo "Testet misslyckades! Ett riktigt nummer har ej godkänts!";
				return FALSE;
			}
			return TRUE;
		}
	}
	
?>
